
Azure Container Hands-on lab
Jun. 2023
### Contents
- [環境の準備](#環境の準備)
- [Exercise 1: 仮想ネットワークへのコンテナー アプリの展開](#exercise-1-仮想ネットワークへのコンテナー-アプリの展開)
- [Exercise 2: API アプリの展開](#exercise-2-api-アプリの展開)
- [Exercise 3: マネージド ID による Azure リソースへのアクセス](#exercise-3-マネージド-id-による-azure-リソースへのアクセス)
- [Exercise 4: サービス間の呼び出し](#exercise-4-サービス間の呼び出し)
- [Exercise 5: cron 式によるスケーリング設定](#exercise-5-cron-式によるスケーリング設定)
- [Exercise 6: Azure Container Apps ジョブの作成](#exercise-6-azure-container-apps-ジョブの作成)
- [Exercise 7: NAT Gateway を使用したトラフィック送信](#exercise-7-nat-gateway-を使用したトラフィック送信)
## 環境の準備
### SQL Server の設定
- [Azure ポータル](#https://portal.azure.com)へアクセス
- 事前展開済みの SQL Server の管理ブレードへ移動し、"**Azure Active Directory**" を選択
- "**管理者の設定**" をクリック
- ポータルへのサインインに使用しているユーザーを選択
- "**保存**" をクリック
- "**ネットワーク**" を選択
- "**ファイアウォール規則**" の "**+クライアント IPv4 アドレス (xxx.xxx.xxx.xxx) の追加**" をクリック
- "**保存**" をクリック
### 仮想マシンへの接続
- 事前展開済みの仮想マシンの管理ブレードへ移動し、"**接続**" - "**Bastion**" を選択
- ユーザー名、パスワードを指定し、仮想マシンへ接続
- 新しいタブで仮想マシンへの接続を行い、デスクトップ画面が表示
### Task 1: リポジトリのフォーク
- Web ブラウザを起動し、[ワークショップのリポジトリ](#https://github.com/kohei3110/AzureContainerApps-Hands-on-Lab-1)へ移動
- 画面右上の "**Fork**" をクリック
- 自身のアカウントにリポジトリが複製されていることを確認
### Task 2: Git の初期構成
- Visual Studio Code を起動 (デスクトップ上の準備されたショートカットをダブルクリック)
- "**Terminal**" - "**New Terminal**" を選択し、ターミナルを表示
- Git の初期設定を実行
- ユーザー名の設定
```
git config --global user.name "User Name"
```
※ User Name を自身の名前に変更
- Email アドレスの設定
```
git config --global user.email "Email@Address"
```
※ {Email Address} を使用するメール アドレスに変更
- 設定値の確認
```
git config --list --global
```
※ 設定したユーザー名・メール アドレスが出力されたら OK
### Task 3: 開発環境へのリポジトリのクローン
- Web ブラウザで Fork したリポジトリの "**Code**" をクリック
表示されるツール チップよりリポジトリの URL をコピー
- Visual Studio Code のサイドバーから Explorer を選択し "**Clone Repository**" をクリック
- リポジトリの URL の入力を求められるためコピーした URL を貼り付け Enter キーを押下
- 複製先となるローカル ディレクトリ (Documents) を選択
GitHub の認証情報が求められる場合は、アカウント名、パスワードを入力し認証を実施
- 複製されたリポジトリを開くかどうかのメッセージが表示されるので "**Open**" をクリック
- Explorer に複製したリポジトリのディレクトリ、ファイルが表示
```
git remote -v
```
- \*\*クローン先の GitHub URL が出力されたら OK
- <自分のアカウント名>/AzureContainerApps-Hands-on-Lab-2 になっていることを確認
- (kohei3110/AzureContainerApps-Hands-on-Lab-2 になっていないことを確認)\*\*
## Exercise 1: 仮想ネットワークへのコンテナー アプリの展開
### Task 1: サブネットの追加
- [Azure ポータル](#https://portal.azure.com)へアクセス
- 事前に展開された仮想ネットワークの管理ブレードを表示
- "**サブネット**" を選択し、"**+サブネット**" をクリック
- プレフィックス値 "**23**" のサブネットを追加
- サブネットが追加されたことを確認
### Task 2: コンテナー アプリの作成
- "**+リソースの作成**" をクリック
- カテゴリから "**コンテナー**" を選択し、、コンテナー アプリの "**作成**" をクリック
- Container Apps 環境の地域を選択し "**新規作成**" をクリック
- Container Apps 環境の作成
- "**基本**"
- "**環境名**": 任意
- "**プラン**": 従量課金
- "**ゾーン冗長**": 無効
- "**監視**"
- "**ログ出力方法**": Azure ログ分析
- "**Log Analytics ワークスペース**": 事前に展開済みのワークスペースを選択
- "**ネットワーク**"
- "**自分の仮想ネットワークを使用する**": はい
- "**仮想ネットワーク**": 事前に展開済みの仮想ネットワークを選択
- "**インフラストラクチャ サブネット**": 先の手順で追加したサブネットを選択
- "**仮想 IP**": 外部
- "**作成**" をクリック
- "**基本**" タブ
- "**プロジェクトの詳細**"
- "**サブスクリプション**": ワークショップで使用中のサブスクリプションを選択
- "**リソース グループ**": ワークショップで使用中のリソース グループを選択
- "**コンテナー アプリ名**": 任意
- "**Container Apps 環境**"
- "**地域**": 先の手順で選択済み
- "**Container Apps 環境**": 作成した Container Apps 環境が選択されていることを確認
- "**コンテナー**"
- "**クイックスタート イメージを使用する**": チェック
- "**確認と作成**" をクリック
- 指定した内容に問題ないことを確認し "**作成**" をクリック
- 作成したコンテナー アプリの管理ブレードへ移動
- "**アプリケーション URL**" をクリック
## Exercise 2: API アプリの展開
### Task 1: ローカルでのアプリケーションの実行
C#
- [Azure ポータル](#https://portal.azure.com)へアクセス
- 事前展開済みの SQL Database である "**AdventureWorksLT**" の管理ブレードへ移動し、**接続文字列** をクリック
- ADO.NET (SQL 認証) の接続文字列をコピー
- Visual Studio Code の Explorer で "**src**" - "**CS**" - "**AspNetCoreApp**" - "**Api**" を選択
- "**New File (
)**" をクリック
- ファイル名を "**appsettings.Development.json**" に指定
- 以下のコードを記述し、ファイルを保存
```
{
"sqlConnectionString": "SQL Database への接続文字列"
}
```
※ 先の手順でコピーした SQL Database への文字列を使用
※ Password を指定
- "**Terminal**" - "**New Terminal**" を選択し、ウィンドウ下部にターミナルを表示
- Api ディレクトリへ移動
```
cd src/CS/AspNetCoreApp/Api
```
- アプリケーションを実行
```
dotnet run
```
- Web ブラウザを起動し、"**http://localhost:5000/api/Product**" へアクセス
※ SQL Database から取得したデータが表示
Java
- [Azure ポータル](#https://portal.azure.com)へアクセス
- 事前展開済みの SQL Database である "**AdventureWorksLT**" の管理ブレードへ移動し、**接続文字列** をクリック
- JDBC (SQL 認証) の接続文字列をコピー
- Visual Studio Code の Explorer で "**src**" - "**Java**" - "**JavaApp**" - "**Api**" - "**src**" - "**main**" - "**resources**" - "**application.properties**" を選択
- 以下のコードを記述し、ファイルを保存
```
logging.level.org.springframework.jdbc.core=DEBUG
spring.datasource.url=<コピーした接続文字列(jdbc:sqlserver://~~loginTimeout=30;)>
spring.datasource.username=sqladmin@
spring.datasource.password=<パスワード>
spring.sql.init.mode=always
```
※ 先の手順でコピーした SQL Database への文字列を使用
※ Password を指定
- Visual Studio Code の Explorer で "**src**" - "**Java**" - "**JavaApp**" - "**Api**" - "**src**" - "**main**" - "**resources**" - "**application-prod.properties**" を選択
- 以下のコードを記述し、ファイルを保存
```
logging.level.org.springframework.jdbc.core=DEBUG
spring.datasource.url=${SqlConnectionString}
spring.datasource.username=sqladmin@
spring.datasource.password=<パスワード>
spring.sql.init.mode=always
server.port=80
※ 先の手順でコピーした SQL Database への文字列を使用
※ Password を指定
- 事前展開済みの Application Insights の管理ブレードへ移動し、**接続文字列** をコピー
- Visual Studio Code の Explorer で "**src**" - "**Java**" - "**JavaApp**" - "**Api**" - "**src**" - "**main**" - "**resources**" - "**applicationinsights.json**" を選択
- Application Insights の接続文字列を設定
```json
{
"connectionString": "InstrumentationKey=xxxxx"
}
```
※ 先の手順でコピーした Application Insights の接続文字列を使用
- Visual Studio Code の Explorer で "**src**" - "**Java**" - "**JavaApp**" - "**Web**" - "**src**" - "**main**" - "**resources**" - "**applicationinsights.json**" を選択
- Application Insights の接続文字列を設定
```json
{
"connectionString": "InstrumentationKey=xxxxx"
}
```
※ 先の手順でコピーした Application Insights の接続文字列を使用
- "**Terminal**" - "**New Terminal**" を選択し、ウィンドウ下部にターミナルを表示
- Api ディレクトリへ移動
```
cd src/Java/JavaApp/Api
```
- アプリケーションを実行
```
./mvnw clean package
./mvnw spring-boot:run
```
- Web ブラウザを起動し、"**http://localhost:8080/api/Product**" へアクセス
※ SQL Database から取得したデータが表示
- Web ディレクトリへ移動
```
cd ../Web
```
- jar ファイルを生成
```
./mvnw clean package
```
### Task 2: Azure Container Registry の設定
- [Azure ポータル](#https://portal.azure.com)へアクセス
- Azure Container Registry の管理ブレードへ移動し、"**アクセス キー**" を選択
※ Azure Container Registry は事前に展開済み
- "**管理者ユーザー**" を有効に設定
### Task 3: Docker イメージの構築 (API アプリ)
- デスクトップ上の "Ubuntu" ショートカットをダブルクリック
- 操作用のプロンプトが起動
- WSL で Windows 側のマウントされたディレクトリへ移動
```
cd /mnt/c/Users/AzureUser/Documents/AzureContainerApps-Hands-on-Lab-2
```
- docker build コマンドを実行しイメージを構築
C#
```
docker build -t yourregistry.azurecr.io/api:v1 -f .docker/CS/dockerfile_backend_api .
```
※ yourreregistry.azurecr.io をコンテナー レジストリのログイン サーバーに変更
※ コマンドのオプション
- **-t**: 名前とタグを **名前:タグ** の形式で指定
- **-f**: dockerfile のパスを指定
Java
```
docker build -t yourregistry.azurecr.io/api:v1 -f .docker/Java/dockerfile_backend_api .
```
※ yourreregistry.azurecr.io をコンテナー レジストリのログイン サーバーに変更
※ コマンドのオプション
- **-t**: 名前とタグを **名前:タグ** の形式で指定
- **-f**: dockerfile のパスを指定
- docker images コマンドを実行し、イメージが表示されることを確認
```
docker images
```
### Task 4: イメージのレジストリへのプッシュ (API アプリ)
- レジストリへログイン
```
docker login yourregistry.azurecr.io
```
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
※ コンテナー レジストリのログイン サーバー名は管理ブレードのアクセス キーから確認可
- Username, Password を指定し、ログインを実行
※ コンテナー レジストリの管理ブレードのアクセス キーから取得できるユーザー名とパスワードを使用
- docker push を使用してレジストリへプッシュ
```
docker push yourregistry.azurecr.io/api:v1
```
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
- Azure ポータルで作成したコンテナー レジストリの管理ブレードへアクセス
- 左側のメニューから「**リポジトリ**」を選択
- リポジトリ内のイメージを確認
### Task 5: シークレットの登録
- [Azure ポータル](#https://portal.azure.com)へアクセス
- 展開したコンテナー アプリの管理ブレードへ移動し、"**シークレット**" を選択
- "**+追加**" をクリック
- SQL Database への接続文字列をシークレットへ追加
- "**キー**": sqlconnectionstring
- "**種類**": Container Apps シークレット
- "**値**": SQL Database への接続文字列
- "**+追加**" をクリック
- Application Insights のインストルメンテーション キーをシークレットへ登録(C#のみ)
- "**キー**": applicationinsights-key
- "**種類**": Container Apps シークレット
- "**値**": インストルメンテーション キー
※インストルメンテーション キーは Application Insights 管理ブレードのプロパティから取得
- 2つのシークレットの登録を確認(Java は 1 つで OK)
### Task 6: リビジョンの作成
- コンテナー アプリの管理ブレードへ移動し、"**リビジョン管理**" を選択
- "**+新しいリビジョンを作成**" をクリック
- クイックスタート イメージをチェックし "**削除**" をクリック
- コンテナー イメージの "**+追加**" - "**アプリ コンテナー**" をクリック
- コンテナーの追加
- "**コンテナーの詳細**"
- "**名前**": mcw-backend-api
- "**イメージのソース**": Azure Container Registry
- "**認証**": 管理者資格情報
- "**レジストリ**": ワークショップで使用中のコンテナー レジストリを選択
- "**イメージ**": api
- "**イメージ タグ**": v1
- "**コンテナー リソースの割り当て**"
- "**CPU コア**": 0.25
- "**メモリ (Gi)**": 0.5
- "**環境変数**"
※ "**+追加**" をクリックし、以下2つを環境変数として追加
- SQL 接続文字列
- "**名前**": SqlConnectionString
- "**ソース**": シークレットの参照
- "**値**": sqlconnectionstring
- Application Insights インストルメンテーション キー( C# のみ)
- "**名前**": ApplicationInsights\_\_InstrumentationKey
- "**ソース**": シークレットの参照
- "**値**": applicationinsights-key
- "**追加**" をクリック
- "**作成**" をクリック
- 新しく展開したリビジョンの実行状態が Running であることを確認
- "**概要**" タブを選択し、"**アプリケーション URL**" をコピー
- Web ブラウザでコピーした FQDN の /api/Product エンドポイントへアクセス
## Exercise 3: マネージド ID による Azure リソースへのアクセス
### Task 1: システム割り当て済みマネージド ID の有効化
- コンテナー アプリの管理ブレードから "**ID**" を選択
- システム割り当て済みの状態を "**オン**" に変更
- "**保存**" をクリック
- 確認のメッセージが表示されるので "**はい**" をクリック
- システム割り当て済みマネージド ID が有効化されたことを確認
### Task 2: SQL Database のアクセス許可設定
- "**AdventureWorksLT**" の管理ブレードへ移動し、"**クエリ エディター (プレビュー)**" を選択
- Active Directory 認証でログイン
- SQL プロンプトでコマンドを実行し、マネージド ID へアクセス許可を付与
```
CREATE USER [your_container_apps] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [your_container_apps];
GO
```
※ your_container_apps をコンテナー アプリ名に変更
- 正常にクエリが実行されたことを確認
### Task 3: Key Vault のアクセス許可設定
- 事前展開済みの Key Vault の管理ブレードへ移動し、"**アクセス制御 (IAM)**" を選択
- "**+追加**" - "**ロールの割り当ての追加**" をクリック
- "**キー コンテナー シークレット ユーザー**" を選択し、"**次へ**" をクリック
- "**アクセスの割り当て先**" で "**マネージド ID**" を選択し、"**+メンバーを選択する**" をクリック
- マネージド ID の選択
- "**サブスクリプション**": ワークショップで使用中のサブスクリプション
- "**マネージド ID**": コンテナー アプリ
- "**選択**": API アプリを展開したコンテナー アプリを選択
- "**選択**" をクリック
- "**メンバー**" にコンテナー アプリが表示されていることを確認し、"**次へ**" をクリック
- "**レビューと割り当て**" をクリック
- ビューを表示し、キー コンテナー シークレット ユーザーにコンテナー アプリが表示されていることを確認
### Task 4: Key Vault へのシークレットの登録
- "**シークレット**" を選択し、"**+生成/シークレット**" をクリック
- シークレットの作成
- "**アップロード オプション**": 手動
- "**名前**": SqlConnectionString
- "**シークレット値**": SQL Database への接続文字列 (Azure AD 認証)
```
Server=tcp:{your_sql_server}.database.windows.net,1433;Initial Catalog=AdventureWorksLT;Authentication=Active Directory MSI;
```
※ {your_sql_server} を使用中の SQL Server 名へ変更
- "**作成**" をクリック
- 登録したシークレットをクリック
- 現在のバージョンに表示される文字列をクリック
- シークレット識別子をコピー
- "**閉じる**" をクリック
### Task 5: コンテナー アプリのシークレットの更新
- コンテナー アプリの管理ブレードへ移動し、"**シークレット**" を選択
- sqlconnectionstring (SQL Database への接続文字列を登録したシークレット)をクリック
- シークレットの編集
- "**キー**": sqlconnectionstring
- "**種類**": Key Vault 参照 (プレビュー)
- "**Key Vault シークレット URL**": コピーしたシークレット識別子
- "**マネージド ID**": システム割り当て
- チェックボックスにチェックを付け、"**保存**" をクリック
- ポータル画面の右上の
をクリックし、Cloud Shell を表示
- 左側のメニューから "**リビジョン管理**" を選択
- 対象のリビジョンをクリックし、右ペインに表示されるリビジョンの詳細から "**再起動**" をクリック
Cloud Shell からの再起動
```
az containerapp revision restart -n {your_container_app} -g {your_resource_group} --revision {revision_name}
```
※ {your_container_app}, {your_resource_group} をコンテナー アプリ名、リソース グループ名に変更
※ {revision_name} はリビジョン管理から取得
- "**概要**" タブを選択し、"**アプリケーション URL**" をコピー
- Web ブラウザでコピーした FQDN の /api/Product エンドポイントへアクセス
## Exercise 4: サービス間の呼び出し
### Task 1: コンテナー アプリのイングレス構成
- コンテナー アプリの管理ブレードに移動し、"**イングレス**" を選択
- イングレス トラフィックを "**Container Apps 環境に限定**" に変更し、"**保存**" をクリック
- "**概要**" タブを選択し、"**アプリケーション URL**" をコピー
- Web ブラウザでコピーした FQDN の /api/Product エンドポイントへアクセス
- アクセスが拒否されることを確認
### Task 2: Dapr の有効化
- "**Dapr**" を選択し、"**有効**" に変更、設定を行い "**保存**" をクリック
- "**アプリ ID**": backend-api
- "**プロトコル**": HTTP
- "**API ログ**": オン
- 確認のメッセージが表示されるので "**続行**" をクリック
### Task 3: Docker イメージの作成 (Web アプリ)
- デスクトップ上の "Ubuntu" ショートカットをダブルクリック
- 操作用のプロンプトが起動
- WSL で Windows 側のマウントされたディレクトリへ移動
```
cd /mnt/c/Users/AzureUser/Documents/AzureContainerApps-Hands-on-Lab-2
```
- docker build コマンドを実行しイメージを構築
C#
```
docker build -t yourregistry.azurecr.io/app:v1 -f .docker/CS/dockerfile_frontend_ui .
```
※ yourreregistry.azurecr.io をコンテナー レジストリのログイン サーバーに変更
※ コマンドのオプション
- **-t**: 名前とタグを **名前:タグ** の形式で指定
- **-f**: dockerfile のパスを指定
Java
```
docker build -t yourregistry.azurecr.io/app:v1 -f .docker/Java/dockerfile_frontend_ui .
```
※ yourreregistry.azurecr.io をコンテナー レジストリのログイン サーバーに変更
※ コマンドのオプション
- **-t**: 名前とタグを **名前:タグ** の形式で指定
- **-f**: dockerfile のパスを指定
- docker images コマンドを実行し、イメージが表示されることを確認
```
docker images
```
### Task 4: イメージのレジストリへのプッシュ (Web アプリ)
- docker push を使用してレジストリへプッシュ
```
docker push yourregistry.azurecr.io/app:v1
```
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
- Azure ポータルで作成したコンテナー レジストリの管理ブレードへアクセス
- 左側のメニューから「**リポジトリ**」を選択
- リポジトリ内のイメージを確認
### Task 5: コンテナー アプリの作成 (Web アプリ)
- "**+リソースの作成**" をクリック
- カテゴリから "**コンテナー**" を選択し、、コンテナー アプリの "**作成**" をクリック
- コンテナー アプリの作成
- "**基本**"
- "**プロジェクトの詳細**"
- "**サブスクリプション**": ワークショップで使用中のサブスクリプション
- "**リソース グループ**": ワークショップで使用中のリソース グループ
- "**コンテナー アプリ名**": aca-workshop-web (任意)
- "**Container Apps 環境**"
※ API のコンテナー アプリと同じ 地域、Container Apps 環境を選択
- "**コンテナー**"
- "**クイックスタート イメージを使用する**": オフ
- "**コンテナーの詳細**"
- "**名前**": mcw-frontend-ui
- "**イメージのソース**": Azure Container Registry
- "**レジストリ**": ワークショップで使用中のコンテナー レジストリを選択
- "**イメージ**": app
- "**イメージ タグ**": v1
- "**コンテナーリソースの割り当て**"
- "**CPU とメモリ**": 0.25 CPU コア、0.5 Gi メモリ
- "**環境変数**"
※ Dapr アプリ ID と Application Insights インストルメンテーション キーを環境変数として追加
- Dapr アプリ ID
- "**名前**": AppId
- "**値**": backend-api (API アプリの Dapr アプリ ID)
- Application Insights のインストルメンテーション キー
- "**名前**": ApplicationInsights\_\_InstrumentationKey
- "**値**": インストルメンテーション キー
※インストルメンテーション キーは Application Insights 管理ブレードのプロパティから取得
- "**イングレス**"
- "**イングレス**": 有効
- "**イングレス トラフィック**": どこからでもトラフィックを受け入れます
- "**イングレス タイプ**": HTTP
- "**ターゲット ポート**": 80
- "**確認と作成**" をクリック
- 指定した内容に問題がないことを確認し、"**作成**" をクリック
- 作成したコンテナー アプリの管理ブレードへ移動し、"**Dapr**" を選択
- Dapr を "**有効**" に変更、設定を行い "**保存**" をクリック
- "**アプリ ID**": frontend-ui
- "**プロトコル**": HTTP
- "**API ログ**": オン
- "**概要**" タブを選択し、"**アプリケーション URL**" をクリック
- 新しいタブでアプリが表示
## Exercise 5: cron 式によるスケーリング設定
### Task 1: スケール ルールの設定
- コンテナー アプリ (Web アプリ) の管理ブレードへ移動、"**スケールとレプリカ**" を選択
- "**編集とデプロイ**" をクリック
- "**スケーリング**" タブを選択し、"**+追加**" をクリック
- スケール ルールの追加
- "**スケール ルールの詳細**"
- "**ルール名**": cron-scaling
- "**種類**": カスタム
- "**カスタム ルールの種類**": cron
- "**メタデータ**"
- "**名前**": timezone / "**値**": Asia/Tokyo
- "**名前**": start / "**値**": 0 14 \* \* \* (任意)
- "**名前**": end / "**値**": 0 15 \* \* \* (任意)
- "**名前**": desiredReplicas / "**値**": 3
※ 開始、終了時間は近い時間を指定
- ルールが追加されたことを確認し、"**作成**" をクリック
- 新しいリビジョンを展開
- 指定した時間以降にメトリック (Replica Count) を確認
## Exercise 6: Azure Container Apps ジョブの作成
### Task 1: ローカルでのアプリケーションの実行
C#
- Visual Studio Code "**Terminal**" - "**New Terminal**" を選択し、ウィンドウ下部にターミナルを表示
- Api ディレクトリへ移動
```
cd src/CS/Job
```
- アプリケーションを実行
```
dotnet run
```
- ターミナルに実行結果が表示
Java
- Visual Studio Code "**Terminal**" - "**New Terminal**" を選択し、ウィンドウ下部にターミナルを表示
- Api ディレクトリへ移動
```
cd src/Java/Job
```
- アプリケーションを実行
```
./mvnw clean package
./mvnw spring-boot:run
```
- ターミナルに実行結果が表示
### Task 2: Docker イメージの作成 (Web アプリ)
- デスクトップ上の "Ubuntu" ショートカットをダブルクリック
- 操作用のプロンプトが起動
- WSL で Windows 側のマウントされたディレクトリへ移動
```
cd /mnt/c/Users/AzureUser/Documents/AzureContainerApps-Hands-on-Lab-2
```
- docker build コマンドを実行しイメージを構築
C#
```
docker build -t yourregistry.azurecr.io/job:v1 -f .docker/CS/dockerfile_job .
```
※ yourreregistry.azurecr.io をコンテナー レジストリのログイン サーバーに変更
※ コマンドのオプション
- **-t**: 名前とタグを **名前:タグ** の形式で指定
- **-f**: dockerfile のパスを指定
Java
```
docker build -t yourregistry.azurecr.io/job:v1 -f .docker/Java/dockerfile_job .
```
※ yourreregistry.azurecr.io をコンテナー レジストリのログイン サーバーに変更
※ コマンドのオプション
- **-t**: 名前とタグを **名前:タグ** の形式で指定
- **-f**: dockerfile のパスを指定
- docker images コマンドを実行し、イメージが表示されることを確認
```
docker images
```
### Task 3: イメージのレジストリへのプッシュ (Web アプリ)
- docker push を使用してレジストリへプッシュ
```
docker push yourregistry.azurecr.io/job:v1
```
※ yourreregistry.azurecr.io を作成したコンテナー レジストリのログイン サーバーに変更
- Azure ポータルで作成したコンテナー レジストリの管理ブレードへアクセス
- 左側のメニューから「**リポジトリ**」を選択
- リポジトリ内のイメージを確認
### Task 4: スケジュール ジョブの作成
- ポータル画面の右上の
をクリックし、Cloud Shell を表示
- Azure CLI を使用し、スケジュールされたジョブを作成
```
az containerapp job create \
--name "your_container_apps" --resource-group "your_resource_group" --environment "your_container_apps_env" \
--trigger-type "Schedule" \
--replica-timeout 60 --replica-retry-limit 1 --replica-completion-count 1 --parallelism 1 \
--image "yourregistry.azurecr.io/job:v1" \
--registry-server "yourregistry.azurecr.io" \
--registry-identity "system" \
--cpu "0.25" --memory "0.5Gi" \
--cron-expression "*/5 * * * *"
```
※ "**your_container_apps**: Azure Container Apps ジョブの名前
※ "**your_resource_group**:: リソース グループ名
※ "**your_container_apps_env**": Container Apps 環境
※ "**youreregistry**": コンテナ レジストリのレジストリ名
※ az containerapp job コマンド: https://learn.microsoft.com/ja-jp/cli/azure/containerapp/job?view=azure-cli-latest
### Task 5: ジョブの実行履歴の確認
- 作成したジョブの管理ブレードへ移動
- "**Excution history**" を選択し、実行履歴を確認、"**View logs**" をクリック
- ログの画面が表示
- 展開して詳細を確認
## Exercise 7: NAT Gateway を使用したトラフィック送信
### Task 1: NAT Gateway の作成
- "**+リソースの作成**" をクリック
- テキストボックスに "**NAT**" と入力、表示される候補より "**NAT ゲートウェイ**" を選択
- "**作成**" - "**NAT ゲートウェイ**" をクリック
- NAT ゲートウェイの作成
- "**基本**"
- "**プロジェクトの詳細**"
- "**サブスクリプション**": ワークショップで使用中のサブスクリプション
- "**リソース グループ**": ワークショップで使用中のリソース グループ
- "**インスタンスの詳細**"
- "**NAT ゲートウェイ名**": ng-workshop-q4 (任意)
- "**地域**": リソース グループと同じ地域
- "**可用性ゾーン**": ゾーンなし
- "**TCP アイドル タイムアウト (分)**": 4 (既定)
- "**送信 IP**"
- "**パブリック IP アドレス**": 新規作成 (名前: pip-ng-workshop-q4 (任意))
- "**サブネット**"
- "**仮想ネットワーク**": なし
- "**確認および作成**" をクリック
- 指定した内容に問題がないことを確認し、"**作成**" をクリック
- NAT ゲートウェイの管理ブレードへ移動、"**送信 IP**" をクリック
※ 表示される IP アドレスをコピー
### Task 2: SQL Server のファイアウォールの構成
- SQL Server の管理ブレードへ移動、"**ネットワーク**" を選択
- ファイアウォール規則の "**+ファイアウォール ルールの追加**" をクリック
- "**ルール名**": NatGateway (任意)
- "**開始 IP**": NAT ゲートウェイの送信 IP
- "**終了 IP**": NAT ゲートウェイの送信 IP
- "**Azure サービスおよびリソースにこのサーバーへのアクセスを許可する**" のチェックボックスをオフに指定
- "**保存**" をクリック
### Task 3: アプリケーションの動作確認
- コンテナー アプリ (Web アプリ) の管理ブレードへ移動
- アプリケーション URL をクリックし、新しいタブでアプリケーションへアクセス
※ データが表示されないことを確認
※ データが表示される場合は、API アプリのリビジョンを再起動
```
az containerapp revision restart -n your_container_apps -g your_resource_group --revision revision_name
```
- Application Insights の管理ブレードへ移動、"**失敗した要求**" をクリック
- "**上位 3 例外の種類**" - "**SqlException**" をクリック
- 右ペインで接続に使用される IP アドレスが許可されていないことが原因であることを確認
### Task 3: サブネットへ NAT ゲートウェイを関連付け
- NAT ゲートウェイの管理ブレードへ移動、"**サブネット**" を選択
- コンテナー アプリを展開した仮想ネットワーク、サブネットを選択
- "**保存**" をクリック
- コンテナー アプリ (Web アプリ) の管理ブレードへ移動
- アプリケーション URL をクリックし、新しいタブでアプリケーションへアクセス
※ SQL Database から取得したデータが表示されることを確認